package com.randi.common.utils;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author ziye
 */
public class ArrayUtils {

    /**
     * 并集
     *
     * @param list1 数组1
     * @param list2 数组2
     * @param <T>   泛型
     * @return 数组并集
     */
    public static <T> List<T> union(List<T> list1, List<T> list2) {
        return Stream.concat(list1.stream(), list2.stream())
                .collect(Collectors.toList());
    }

    /**
     * 交集
     *
     * @param list1 数组1
     * @param list2 数组2
     * @param <T>   泛型
     * @return 数组交集
     */
    public static <T> List<T> intersection(List<T> list1, List<T> list2) {
        Set<T> set = new HashSet<>(list2);
        return list1.stream()
                .filter(set::contains)
                .collect(Collectors.toList());
    }

    /**
     * 差集
     * 数组1 - 数组2
     *
     * @param list1 数组1
     * @param list2 数组2
     * @param <T>   泛型
     * @return 数组差集
     */
    public static <T> List<T> difference(List<T> list1, List<T> list2) {
        Set<T> set = new HashSet<>(list2);
        return list1.stream()
                .filter(t -> !set.contains(t))
                .collect(Collectors.toList());
    }

}
